// 期中测试编程题
#include <iostream>
using namespace std;

// Q21 素数筛
void Q21() {
  int n;
  cin >> n;
  // 1 表示合数，0 表示质数，默认为质数
  bool prime[n + 1] = {1, 1, 0};
  for (int i = 2; i <= n / i; i++) {
    if (!prime[i]) {
      for (int j = i * i; j <= n; j += i) {
        prime[j] = 1;
      }
    }
  }
  int count = 0;
  for (int i = 2; i <= n; i++) {
    if (!prime[i]) {
      count++;
    }
  }
  cout << count << endl;
}

// Q22 车厢重组（考点：冒泡排序）

void Q22() {
  // 输入 n 节车厢，和每节的车厢号
  int n;
  cin >> n;
  int train[n];
  for (int i = 0; i < n; i++) {
    cin >> train[i];
  }
  // 要求利用桥墩，将车厢重新升序排列，并输出最少的旋转次数
  int count = 0;  // 最少的旋转次数
  // 冒泡排序
  for (int i = n; i > 0; i--) {
    for (int j = 0; j < i; j++) {
      if (train[j] > train[j + 1]) {
        // 交换
        int temp = train[j];
        train[j] = train[j + 1];
        train[j + 1] = temp;
        // 交换次数 +1
        count++;
      }
    }
  }
  cout << count << endl;
}

// Q23 图形旋转（考点：二维数组，矩阵转置）
void Q23() {
  // 输入 n 行 m 列的矩阵
  int n, m;
  cin >> n >> m;
  int a[n][m];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
    }
  }
  // 将矩阵元素旋转 90 度输出
  // 行变列，列变行
  // 原始：一行一行从上往下，每列从左往右
  // 旋转：一列一列从左往右，每行从下往上
  for (int i = 0; i < m; i++) {
    for (int j = n - 1; j >= 0; j--) {
      cout << a[j][i] << " ";
    }
    cout << '\n';
  }
}

// Q24 找第一个只出现一次的字符
void Q24() {
  string s;
  cin >> s;
  // 创建一个长度为 26 的数组，记录每个字符出现的次数
  int count[26] = {0};
  for (int i = 0; i < s.size(); i++) {
    count[s[i] - 'a']++;
  }
  // 找到第一个只出现一次的字符
  for (int i = 0; i < s.size(); i++) {
    if (count[s[i] - 'a'] == 1) {
      cout << s[i] << endl;
      break;
    }
  }
  cout << "no" << endl;
}

// Q25 文字处理软件
void Q25() {
  int q;
  cin >> q;
  string str;
  // getline(cin, str);
  cin >> str;
  while (q--) {
    int n, a, b;
    string s;
    cin >> n;
    switch (n) {
      case 1:  // 拼接 str 末尾插入并输出新串
        // getline(cin, s);
        cin >> s;
        str += s;
        cout << str << endl;
        break;
      case 2:  // 截取并输出 str 中 a 开始后 b 个字符
        int a, b;
        cin >> a >> b;
        cout << str.substr(a, b) << endl;
        break;
      case 3:  // 插入 str 中 a 位置插入 s
        cin >> a;
        // getline(cin, s);
        cin >> s;
        str.insert(a, s);
        cout << str << endl;
        break;
      case 4:  // 查找子串
        cin >> s;
        cout << str.find(s) << endl;
        break;
    }
  }
}

int main() {
  Q25();
  return 0;
}